
#include "./subs/sub.h"
#include <stdint.h>

#ifdef WINDOWS
#define EXPORT_API extern "C" __declspec(dllexport)
#else
#define EXPORT_API extern "C"
#endif

enum wNum
{
    w1,
    w2 = 100,
    w3,
};

//测试 结构体
struct BigNum
{
    struct insideStc
    {
        float aa;
        int b;
    } is0;

    unsigned int B1;
    wNum wB;
    float *B2;
    insideStc is1;
};

//地址类型
enum AddRessType{
    INT,
    UINT,
    FLOAT,
};

static const BigNum m_emptyRc;
static const int AIII = 23; 

typedef void (*stringAct)(const char16_t* str);

//----------------------------------------基本的测试-----------------------------------------------------
//空结构体 
struct mesh;
typedef float* num_Array;

//注册 获取字符串 回调 函数
EXPORT_API void regStrAct(stringAct val);

//参数 字符串
EXPORT_API void pString(char16_t* val, char *buf_arr);

//返回值 字符串
EXPORT_API char16_t* retString(char* buf_arr);

//参数 handle_void
EXPORT_API void pHVoid(void* val,char *buf_arr);

//返回值 handle_void
EXPORT_API void* retHVoid(int * xxx_arr);

//参数 空结构Handel
EXPORT_API void pHStruct(mesh* val, char *buf_arr);

//返回值 空结构Handel
EXPORT_API mesh* retHStruct();

//函数形参指针，参名后缀标识意图
//参名后缀 _out ，用作 传出值（ref）
EXPORT_API void pSuffixOut(int * val_out);

//参名后缀 _arr ，用作 数组
EXPORT_API void pSuffixArr(int *val_arr , int arrLen, char *buf_arr);

//参名后缀 _arr ，用作 句柄（地址ID）
EXPORT_API void pSuffixHandle(int * val_handle, char *buf_arr);

//函数返回值指针,类型别名标识意图
EXPORT_API num_Array retAliasArray(float * buf_arr , int bufLen, int* __retArrLen_out);

//-----------------------------------------默认值测试-----------------------------------------------------
//函数默认值
EXPORT_API int testPDefVal(int a = 12 , int b = 4);

//参数默认值
EXPORT_API int testPDefValComp(AddRessType a = INT , BigNum b = m_emptyRc , int * c = nullptr , int* d_arr = nullptr , int* c_out = nullptr);

//-----------------------------------------综合测试-------------------------------------------------------

//无参函数
EXPORT_API float voidFun();

//打印地址的类型
EXPORT_API void printaddress(void* address ,AddRessType _type );

//数值 相加 （形参 基础类型指针）
EXPORT_API float addNum(float a, float b , float *aa_out);

//数值 相减 （返回值 基础类型指针 、 全局静态函数声明）
SUB_EXPORT_API  void* subNum(float a , float b , int *aa_out);

//数值 相乘
EXPORT_API float mulNum(float a , float *b_arr , int arrSize);

//字符串操作
EXPORT_API char16_t* repeatStr(char16_t* str ,  char* buf_arr);
